package com.tedu.api.io;

import org.apache.commons.imaging.ImageFormats;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;
import org.apache.commons.imaging.Imaging;
import org.junit.Test;

import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.charset.StandardCharsets;

/**流---专门处理数据传输为:文本
 *高级流---处理文本---"转换流"
 *字符流:针对读写抽象类【Reoder抽象类  Writer抽象类】
 *
 * 节点流与字符流区别：单位进行区分，节点流最小单位：字节
 *                             字符流最小单位:字符
 *
 * 高级流【转换流】功能:处理文本内容
 * 字符流的子实现类:InputStreamReader  继承Reader抽象类  读入操作
 *                OutputStreamWriter   继承 Writer抽象类  写入操作
 * 高级流--->转换流【字符流】  按照功能划分--->处理文本读写操作
 * 功能：处理节点又可以被其他流所处理，类转换器
 */
public class IOSAPI {
    /**
     *从API文件中 写出 osw.txt文件---一行文本
     *
     */
    @Test
    public void testOSW(){
        //创建一个低级流和相对应的高级流(能创建并添加东西那种),然后低级流会被高级所覆盖随后在里面写出文本内容,
        //然后在创建的文本内容中添加东西,然后把所有异常点选中,ctrl+alt+t选中低第8个
        //随后添加一个FileNotFoundException的路径或者文件错的异常,最后if进行关闭,把异常包住,最后输出就行
        //这种输出不用sout的那个输出语句
        FileOutputStream fos=null;//低级流  搬运数据
        OutputStreamWriter osw=null;//高级流  转换流  套低级流  套其他高级流
        //捕获流中的异常  抓起来
        try {
            fos = new FileOutputStream("osw.txt");
            osw = new OutputStreamWriter(fos);//转换流  套低级流  套其他高级流
            //转换流中方法 write() 直接写出文本内容,不需要把文本转换为二进制
            //高级流---转换流
            osw.write("");//省去传字节数组
            osw.write("duang~~\n");//省去传字节数组
            osw.write("FA~~O");//  \n是文本中的换行操作
        }catch(FileNotFoundException e){//路径错或者文件错
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {//必须关闭  关高级
            if(osw!=null){
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }

    /**
     * 转换流:
     * Writer抽象类---子实现类OutputStreamWriter 字符输出流  写出  以字符形式
     * Reader抽象类---子实现类InputStreamReader  字符输入流  不是以字符形式输出
     *                                 int类型的二进制 【无法直接读取字符串】
     *
     * 高级流:针对转换流中InputStreamReader无法直接读入字符串
     * BufferedWriter  套在转换流的高级流  缓冲输入流
     * BufferedReader  套在转换流的高级流  缓冲输出流
     * 特点:按照行的形式读取字符串,【换行代表文件读取完毕】
     *
     * 转换流中出现异常:UnsupportedEncodingException编码集转换异常
     *      为何产生:转换器【字符输入/输出】指定编码集不对称
     *                IOException IO中的大异常
     *
     */
    @Test
    public void testISR() {
        //流进行置空
        FileInputStream fis = null;
        InputStreamReader isr = null;//指定编码集，无法读取字符串
        BufferedReader br = null;//缓冲输入流:解决 读取字符串
        //捕获异常
        try {
            //fis = new FileInputStream("osw.txt");
            fis=new FileInputStream("osw.txt");
            isr = new InputStreamReader(fis, "UTF8");//转换流转换字符输出流
            br = new BufferedReader(isr);//缓冲输入流
            /**
             * readLine()读取若干字符串,直到读完为止【没有换行代表读完】
             *                 读取数据返回值字符串
             * 如果返回值不为null,表示所有数据没有读取完毕
             *         为null,表示数据读取完毕【没有换行符】
             */
            //UTF8 支持多种语言
            String line=null;
            //读取数据保存在line中,判断line不为空---输出文本
            //(line=br.readLine())!=null
            while((line=br.readLine())!=null){
                System.out.println(line);
            }
            isr.read();
            String str = br.readLine();//返回值 String
            System.out.println("读取数据:" + str);
        } catch (FileNotFoundException e) {//文件不存在
            e.printStackTrace();
        }catch(UnsupportedEncodingException e) {//编码集异常
            e.printStackTrace();
        }catch (IOException e) {//IO流异常
            e.printStackTrace();
        } finally {
            //关闭
            if(br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    @Test
    public void testHomeWork() {
        //五异常
        try {
            File f = new File(".");
            System.out.println(f.getCanonicalPath());//要么叉出去，要么框住
        } catch (IOException e) {//IO异常
            e.printStackTrace();
        }
        try {
            String s = ".1";
            Integer.parseInt(s);
        } catch (NumberFormatException e) {//好像是数值转换异常
            e.printStackTrace();
        }
        try {
            String d = "2";
            d.getBytes("");
            Integer.parseInt(d);
        } catch (UnsupportedEncodingException e) {//不支持编码串异常
            e.printStackTrace();
        }
        try {
            FileOutputStream f=new FileOutputStream("fos.txt");
        } catch (FileNotFoundException e) {//找不到文件异常
            e.printStackTrace();
        }
        try {
            File file = new File("8edd7e93e88c25ce31e77a2a7d2cbc19-removebg-preview.png");
            BufferedImage src= Imaging.getBufferedImage(file);//叉出去
            File desc=new File("写出图片.gif");
            Imaging.writeImage(src,desc, ImageFormats.PNG,null);//叉叉出去
        } catch (ImageReadException e) {//无法读取图片异常
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ImageWriteException e) {//图片写入异常
            e.printStackTrace();
        }

    }


    //显示在控制台
    @Test
    public void testHomeWork2() {
        FileInputStream fis = null;
        InputStreamReader isr = null;
        BufferedReader br = null;

        String str = null;//返回值 String
        try {
            fis=new FileInputStream("src\\main\\java\\com\\tedu\\api\\io\\IOSAPI.java");
            isr = new InputStreamReader(fis, StandardCharsets.UTF_8);//转换流转换字符输出流
            br = new BufferedReader(isr);//缓冲输入流

            String line=null;

            while((line=br.readLine())!=null){
                System.out.println(line);
            }
            isr.read();
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        System.out.println("读取数据:" + str);
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    /**
     * 高级流--特殊1.直接创建高级流
     * 2.不是成对---BufferedReader
     * 3.直接写出文本
     * PrintWriter 字符输出流
     * 需求:从程序写出  pw.txt 文件 指定编码集:UTF8,输出几行文本
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //创建高级流 特殊的 能直接创建 套三个流FileOutStream  搬运数据的低级  工具人
        //                                OutputStreamWriter 高级流 转换流 指定编码集 领导
        //                                 BufferedWriter  高级流  套在转换流上  工程师
        PrintWriter pw=new PrintWriter("pw.txt","utf8");//前端得\8  叉出去
        //print() 输出一行文本 不换行   printIn() 换行
        pw.print("你干嘛");
        pw.println("哈哈哎呦");
        pw.close();
    }
}
